﻿using System;
using System.Collections;
using System.Data;
using CapaDatos;
using CapaDatos.ModuloSoporte;
using Entidades;
using ModuloSoporte.Validadores;

namespace ModuloSoporte
{
    public static class AdministradoraUsuarios
    {
        public static bool Acceder(string user, string clave)
        {
            DataSet ds = DatosSoporte.LoguearUsuario(user, clave);
            if (Datos.EstaVacio(ds))
                return false;
            else
            {
                object[] valores = Datos.GetValores(ds);
                Usuarios u = new Usuarios(valores[0].ToString(), "", valores[1].ToString());

                if (u.Tipo == "Servidor")
                    return false;

                ModuloSoporte.Global.TipoUsuario = u.Tipo;
                ModuloSoporte.Global.Usuario = u.Usuario;
                Global.CodEmpresa = 0;
                return true;
            }
        }

        public static bool AccederServidor(string user, string clave)
        {
            DataSet ds = DatosSoporte.LoguearUsuario(user, clave);
            if (Datos.EstaVacio(ds))
                return false;
            else
            {
                object[] valores = Datos.GetValores(ds);
                Usuarios u = new Usuarios(valores[0].ToString(), "", valores[1].ToString());

                if (u.Tipo != "Servidor")
                    return false;

                ModuloSoporte.Global.TipoUsuario = u.Tipo;
                ModuloSoporte.Global.Usuario = u.Usuario;
                Global.CodEmpresa = 0;
                return true;
            }
        }

        public static bool Existe(string usuario)
        {
            return DatosSoporte.ExisteUsuario(usuario);
        }

        public static void CrearEmpresa(
            // Page 1: Empresa
            string Razon, 
            string Mail, 
            string Cuit, 
            string SituacionIVA,

            // Page 2: Admin
            string AdminName, 
            string AdminPass, 
            string AdminMail, 
            
            // Page 3: Sucursal
            string SucName, 
            bool CheckCasaCentral,
            string Provincia,
            string Localidad, 
            string Dir, 
            string DirNumber,
            string DirPiso,
            string CP,
            string Tel,
            string Fax,
            string Facturacion,

            // Page 4: Período
            DateTime dateStart,
            DateTime dateEnd
        )
        {
            foreach(IValidador v in new IValidador[] {
                new ValidadorEmptyField(Razon, "Razón Social"),
                new ValidadorEmail(Mail),
                new ValidadorCuit(Cuit),
                new ValidadorEmptyField(SituacionIVA, "Situación IVA"),
                new ValidadorUser(AdminName),
                new ValidadorPassword(AdminPass),
                new ValidadorEmail(AdminMail),
                new ValidadorEmptyField(SucName, "Nombre de Sucursal"),
                new ValidadorEmptyField(Provincia, "Provincia"),
                new ValidadorEmptyField(Localidad, "Localidad"),
                new ValidadorEmptyField(Facturacion, "Facturación"),
            })
            {
                v.Validar();
            }

            ArrayList rollback = new ArrayList();

            try
            {
                //
                // Empresa
                //
                var empresa = new Entity_empresa
                {
                    Cuit = long.Parse(Cuit),
                    Mail = Mail,
                    Razonsocial = Razon,
                    Situacioniva = short.Parse(SituacionIVA)
                };

                empresa = Gestor<Entity_empresa>.Insertar(empresa);
                rollback.Add(empresa);

                //
                // Usuario
                //

                var admin = new Entity_usuarios
                {
                    Usuario = AdminName,
                    Email = AdminMail,
                    Tipousuario = "Administrador",
                    Password = AdminPass
                };

                Gestor<Entity_usuarios>.Insertar(admin);
                rollback.Add(admin);

                //
                // Sucursal
                //
                if (string.IsNullOrEmpty(Facturacion))
                    Facturacion = "0";
                if (string.IsNullOrEmpty(DirNumber))
                    DirNumber = "0";
                if (string.IsNullOrEmpty(DirPiso))
                    DirPiso = "0";
                if (string.IsNullOrEmpty(Provincia))
                    Provincia = "1";

                var sucursal = new Entity_sucursal
                {
                    Casacentral = CheckCasaCentral,
                    Cp = CP,
                    Descripcion = SucName,
                    Direccion = Dir ?? "",
                    Fax = Fax,
                    Habilitada = true,
                    Localidad = Localidad,
                    Nrofacturacion = int.Parse(Facturacion),
                    Num = int.Parse(DirNumber),
                    Piso = int.Parse(DirPiso),
                    Provincia_codprov = int.Parse(Provincia),
                    Telefono = Tel,

                    Empresa_idempresa = empresa.Idempresa
                };

                sucursal = Gestor<Entity_sucursal>.Insertar(sucursal);
                rollback.Add(sucursal);

                //
                // Ejercicio
                //

                var ejercicio = new Entity_ejercicio
                {
                    Estado = "abierto",
                    Fechainicio = dateStart,
                    Fechafin = dateEnd,

                    Empresa_idempresa = empresa.Idempresa
                };

                ejercicio = Gestor<Entity_ejercicio>.Insertar(ejercicio);
                rollback.Add(ejercicio);

                //
                // Relación Usuario
                //

                var r_emp_u = new Entity_empresa_has_usuarios
                {
                    Usuarios_usuario = AdminName,
                    Permisos = 7,

                    Empresa_idempresa = empresa.Idempresa
                };

                r_emp_u = Gestor<Entity_empresa_has_usuarios>.Insertar(r_emp_u);
                rollback.Add(r_emp_u);

                //
                // Relación Sucursal
                //

                var r_suc_u = new Entity_usuarios_has_sucursal
                {   
                    Sucursal_codigosucursal = sucursal.Codigosucursal,
                    Usuarios_usuario = AdminName,
                    Permisos = 7,
                    Sucursal_empresa_idempresa = empresa.Idempresa
                };

                r_suc_u = Gestor<Entity_usuarios_has_sucursal>.Insertar(r_suc_u);
                rollback.Add(r_suc_u);

            }
            catch (Exception ex)
            {
                foreach (var obj in rollback)
                {
                    try
                    {
                        GGestor.Eliminar(obj);
                    }
                    catch { }
                }

                throw ex;
            }
        }
    }
}
